#include "stdafx.h"
#include "oknoglowne.h"


using namespace SymulacjaGUI;

OknoGlowne::OknoGlowne() : Form1() {
	
   inicjalizacja();
   loaded = 0;
   serwer = gcnew Serwer(5000);
   serwer->startuj();
   list1 = gcnew PointPairList();
   list2 = gcnew PointPairList();
   list3 = gcnew PointPairList();
   symulator = gcnew Symulator(this);
   obserwuj(symulator);
   serwer->obserwuj(symulator);
   symulator->wczytajKonfiguracje();
   fingerprint = gcnew Autoryzowany();
   symulator->ustawAutoryzowaneGUI(fingerprint);
}



void OknoGlowne::obserwuj(ObiektObserwowalny^ obiektObserwowalny) {
   obiektObserwowalny->dodajObserwatora(this);
}

System::Void OknoGlowne::Okno_Load(System::Object^  sender, System::EventArgs^  e) {
		   loaded = 1;
		}

void OknoGlowne::aktualizuj(int zdarzenie) {
	if(loaded) {
	aktualizujStan_d^ aktualizujStanDelegat = gcnew aktualizujStan_d(this, &OknoGlowne::aktualizujWGlownymWatku);
	this->Invoke(aktualizujStanDelegat,gcnew array<System::Object^>(1){zdarzenie});
	} else {
	//ten delegat mial sluzyc do oddelegowania aktualizacji na pewno do glownego watku
	//inaczej kontrolki nie bardzo chca sie odswiezyc kiedy probuje sie to zrobic z innego watku niz glowny
	//nistety nie mozna wywolac w trakcie konstrukcji okna a a symulator sie spieszy z tym strasznie
		aktualizujWGlownymWatku(zdarzenie);
	}
}

void OknoGlowne::aktualizujWGlownymWatku(int zdarzenie) {
	int wyswietlonyGen;
   switch (zdarzenie) {
   case TematAktualizacji::nowaMapaRegulatorow:
      dodajMapeDoComboBox(symulator->pobierzMapeRegulatorow(),comboBoxRegulator);
      break;

   case TematAktualizacji::nowaMapaObiektow:
      dodajMapeDoComboBox(symulator->pobierzMapeObiektow(),comboBoxObiekt);
      break;

			   
   case TematAktualizacji::nowaMapaWartZad:
      dodajMapeDoComboBox(symulator->pobierzMapeWartZad(),comboBoxWartZad);
      break;
			   
   case TematAktualizacji::zmianaRegulatora:
      try {
	 std::map<std::string, std::string> konfig = symulator->pobierzKonfigRegulatora();
	 dodajMapeDoDataGrid(konfig,dataGridNastawyRegulatora);
	 std::map<std::string, std::string>::iterator it = konfig.find("[nazwa]=");
	 if(it != konfig.end()) {
	    this->textBoxRegulator->Text = ToSysString(it->second);
	 }

      } catch(Wyjatek w) {
	 this->dataGridNastawyRegulatora->Rows->Clear();
	 textBoxRegulator->Clear();
	 MessageBox::Show("Wystapil wyjatek" + ToSysString(w.pobierzNazwe()),
			  "Symulacja ARMAX", MessageBoxButtons::OK,
			  MessageBoxIcon::Error);
      }
      break;

   case TematAktualizacji::zmianaObiektu:
      try {
	 std::map<std::string, std::string> konfig = symulator->pobierzKonfigObiektu();
	 dodajMapeDoDataGrid(konfig,dataGridNastawyObiektu);
	 std::map<std::string, std::string>::iterator it = konfig.find("[nazwa]=");
	 if(it != konfig.end()) {
	    textBoxObiekt->Text = ToSysString(it->second);
	 } else {
	    textBoxObiekt->Clear();
	 }	

      } catch(Wyjatek w) {
	 dataGridNastawyObiektu->Rows->Clear();
	 textBoxObiekt->Clear();
	 MessageBox::Show("Wystapil wyjatek" + ToSysString(w.pobierzNazwe()),
			  "Symulacja ARMAX", MessageBoxButtons::OK,
			  MessageBoxIcon::Error);
      }
      break;

   case TematAktualizacji::nowaListaUstawionychGeneratorow:
       wyswietlonyGen = listBoxWartZad->SelectedIndex;
      dodajWektorDoListBox(symulator->pobierzListeUstawionychGeneratorow(),listBoxWartZad);
      listBoxWartZad->SelectedIndex = wyswietlonyGen;
      break;

   case TematAktualizacji::nowyKrokSymulacji:
      dodajPktWykresu(symulator->pobierzAktualneWartosci());
      
      break;
   case TematAktualizacji::resetSymulacji:
	   Reset();
	   break;
   }
}

System::Void OknoGlowne::buttonSamonastrajanie_Click(System::Object^  sender, System::EventArgs^  e) {
   /*RegulatorPIDAdapt* regulatorPIDAdaptPtr = dynamic_cast<RegulatorPIDAdapt*>(regulator);
     if (regulatorPIDAdaptPtr && regulatorPIDAdaptPtr->czyPidAdaptacyjny()) {
     regulatorPIDAdaptPtr->ustawSamonastrajanie(true);
     buttonSamonastrajanie->Enabled = false;
     }*/
}

System::Void OknoGlowne::trackBarProbkowanie_Scroll(System::Object^  sender, System::EventArgs^  e) {
   numericUpDownProbkowanie->Value = trackBarProbkowanie->Value;
}

System::Void OknoGlowne::numericUpDownProbkowanie_ValueChanged(System::Object^  sender, System::EventArgs^  e) {
   trackBarProbkowanie->Value = (int)numericUpDownProbkowanie->Value;
   symulator->ustawCzasProbkowania((int)numericUpDownProbkowanie->Value, fingerprint, 0);
}

System::Void OknoGlowne::buttonReset_Click(System::Object^  sender, System::EventArgs^  e) {
   Reset(); //jedno wywolanie mniej? 
   /*buttonStart->Enabled = true;
     buttonStop->Enabled = false;
     buttonWczytaj->Enabled = true;*/
     /*list1->Clear();
     list2->Clear();
     list3->Clear();
     myPane1->XAxis->Scale->Min = 0;
     myPane2->XAxis->Scale->Min = 0;
     dodajPktWykresu(0, 0, 0, 0);
     zedGWykres1->AxisChange();
     zedGWykres1->Refresh();
     zedGWykres2->AxisChange();
     zedGWykres2->Refresh();*/ //lepsze jedno wywolanie wiecej ale nie powtarzany kod

     symulator->symulatorReset(fingerprint, 0);
}

System::Void OknoGlowne::buttonStop_Click(System::Object^  sender, System::EventArgs^  e) {
   //symulacja = false;
   symulator->symulatorStop(fingerprint, 0);
}

System::Void OknoGlowne::buttonOkObiekt_Click(System::Object^  sender, System::EventArgs^  e) {
   symulator->ustawObiekt(comboBoxObiekt->Text, fingerprint, 0);
}



System::Void OknoGlowne::buttonOkRegulator_Click(System::Object^  sender, System::EventArgs^  e) {
   symulator->ustawRegulator(comboBoxRegulator->Text, fingerprint, 0);
}

System::Void OknoGlowne::buttonOkWartZad_Click(System::Object^  sender, System::EventArgs^  e) {
   symulator->dodajWartZad(comboBoxWartZad->Text, fingerprint, 0);
}


System::Void OknoGlowne::dodajMapeDoDataGrid(const std::map<std::string,std::string> &konfig, System::Windows::Forms::DataGridView^  docelowyDataGrid) {
   docelowyDataGrid->Rows->Clear();
   std::map<std::string,std::string>::const_iterator poczatek = konfig.begin();
   for( ; poczatek != konfig.end(); ++poczatek) {
      if ((poczatek->first.compare("[typ]=") != 0) && (poczatek->first.compare("[nazwa]=") != 0)) {
	 array<String^>  ^row = gcnew array<String^> {gcnew String(poczatek->first.c_str()),gcnew String(poczatek->second.c_str())};
	 docelowyDataGrid->Rows->Add(row);
      }
   }
}


System::Void OknoGlowne::dodajMapeDoComboBox(cliext::map<System::String^,int> mapa, System::Windows::Forms::ComboBox^ docelowyComboBox) {
   cliext::map<System::String^, int>::iterator it = mapa.begin();
   for(; it != mapa.end(); ++it) {
      docelowyComboBox->Items->Add(it->first);
   }
   docelowyComboBox->SelectedIndex = 0;
}

System::Void OknoGlowne::dodajWektorDoListBox(cliext::vector<System::String^> wektor,System::Windows::Forms::ListBox^ docelowyListBox) {
   docelowyListBox->Items->Clear();
   cliext::vector<System::String^>::iterator it = wektor.begin();
   for(; it != wektor.end(); ++it) {
      docelowyListBox->Items->Add(*it);
   }
}


System::Void OknoGlowne::usunDyskretne() {
   /*for (int i=0; i<wektorObiektow.size(); i++)	 delete wektorObiektow.at(i);
     wektorObiektow.clear();
     for (int i=0; i<wektorRegulatorow.size(); i++)	 delete wektorRegulatorow.at(i);
     wektorRegulatorow.clear();*/
}


System::Void OknoGlowne::wczytajKonfiguracje() {
   //tutaj bylo wczytanie konfigu, ale sie zmylo :)
}

System::Void OknoGlowne::buttonWczytaj_Click(System::Object^  sender, System::EventArgs^  e) {

   //std::string nazwaObiektu = ToStdString(comboBoxObiekty->Text);
   buttonWczytaj->Enabled = false;
   buttonZapisz->Enabled = true;
   wczytajKonfiguracje();
}


System::Void OknoGlowne::buttonZapisz_Click(System::Object^  sender, System::EventArgs^  e) {
//przycisk narazie niewykorzystany, sa wazniejsze rzeczy
}


System::Void OknoGlowne::Reset() {
   list1->Clear();
   list2->Clear();
   list3->Clear();
   myPane1->XAxis->Scale->Min = 0;
   myPane2->XAxis->Scale->Min = 0;
   dodajPktWykresu(0, 0, 0, 0);
     zedGWykres1->AxisChange();
     zedGWykres1->Refresh();
     zedGWykres2->AxisChange();
     zedGWykres2->Refresh();
   //		nrProbki=1;
}




System::Void OknoGlowne::inicjalizacja() {
   this->buttonWczytaj->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonWczytaj_Click);
   this->buttonOkObiekt->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonOkObiekt_Click);
   this->buttonOkRegulator->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonOkRegulator_Click);
   this->buttonZapisz->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZapisz_Click);
   this->buttonSamonastrajanie->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonSamonastrajanie_Click);
   this->buttonReset->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonReset_Click);
   this->buttonStop->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonStop_Click);
   this->numericUpDownProbkowanie->ValueChanged += gcnew System::EventHandler(this, &OknoGlowne::numericUpDownProbkowanie_ValueChanged);
   this->trackBarProbkowanie->Scroll += gcnew System::EventHandler(this, &OknoGlowne::trackBarProbkowanie_Scroll);
   this->buttonStart->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonStart_Click);
   this->buttonZamknij->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZamknij_Click);
   this->buttonOkWartZad->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonOkWartZad_Click);
   this->listBoxWartZad->SelectedIndexChanged += gcnew System::EventHandler(this, &OknoGlowne::listBoxWartZad_SelectedIndexChanged);
   this->buttonZmienParamGeneratora->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZmienParamGeneratora_Click);
   this->buttonZmienParamRegulatora->Click += gcnew System::EventHandler(this, &OknoGlowne::buttonZmienParamRegulatora_Click);
   this->Load += gcnew System::EventHandler(this, &OknoGlowne::Okno_Load);   

}

System::Void OknoGlowne::buttonZmienParamGeneratora_Click(System::Object^  sender, System::EventArgs^  e) {
   symulator->zmienParametryGeneratora(ToStdString(listBoxWartZad->SelectedItem->ToString()),dataGridDoMapy(listBoxWartZad->SelectedItem->ToString(),dataGridNastawyWartZad), fingerprint, 0);
}

System::Void  OknoGlowne::buttonZmienParamRegulatora_Click(System::Object^  sender, System::EventArgs^  e) {
   symulator->zmienParametryRegulatora(dataGridDoMapy(textBoxRegulator->Text,dataGridNastawyRegulatora), fingerprint, 0);
}

System::Void OknoGlowne::listBoxWartZad_SelectedIndexChanged( System::Object^  sender, System::EventArgs^  e) {
   dodajMapeDoDataGrid(symulator->pobierzKonfigGeneratora(ToStdString(listBoxWartZad->SelectedItem->ToString())), dataGridNastawyWartZad);
}

System::Void OknoGlowne::buttonZamknij_Click(System::Object^  sender, System::EventArgs^  e) {
   this->Close();
}


System::Void OknoGlowne::buttonStart_Click(System::Object^  sender, System::EventArgs^  e) {
   symulator->symulatorStart(fingerprint, 0);
}

System::Void OknoGlowne::dodajPktWykresu(double x, double y1, double y2, double y3 ) {
   list1->Add(x, y1);
   list2->Add(x, y2);
   list3->Add(x, y3);
   
   zedGWykres1->AxisChange();	
   zedGWykres1->Refresh();
   zedGWykres2->AxisChange();
   zedGWykres2->Refresh();
}

System::Void OknoGlowne::dodajPktWykresu(cliext::vector<double> dane) {
   cliext::vector<double>::iterator it = dane.begin();
   dodajPktWykresu(*it,*(it+1),*(it+2),*(it+3));
}

System::Void OknoGlowne::Zamknij() {
   symulator->symulatorStop(fingerprint, 0);
}

std::map<std::string,std::string> OknoGlowne::dataGridDoMapy(System::String^ nazwa, System::Windows::Forms::DataGridView^ dataGrid) {
   std::map<std::string,std::string> wynik;
   wynik["[nazwa]="] = ToStdString(nazwa);
   wynik["[typ]="] = "pustka"; //taki hack, bo ObiektDyskretny musi koniecznie
                               //miec 2 pola wiecej niz to konieczne nazwa i typ
                               //a info o typie tutaj nie ma - to nie bug, to ficzer
   for(int i = 0; i < dataGrid->RowCount; i++) {
      wynik[ToStdString(dataGrid[0,i]->Value->ToString())] = ToStdString(dataGrid[1,i]->Value->ToString());
   }
   return wynik;
}
